home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_02 / pipkin / stdio.c < prev   
Text File  |  1995-01-09  |  3KB  |  105 lines

  1. /*==========================================================================*\
  2.  
  3.    stdio.c  (With apologies to the real stdio.c)
  4.  
  5.       Provides (extremely) minimal I/O capabilities via a serial port;
  6.       useful for debugging in an embedded environment.
  7.  
  8.    Donated to the public domain by Jeff D. Pipkins, who of course is
  9.    not liable for damages...
  10.  
  11. \*--------------------------------------------------------------------------*/
  12.  
  13. #define PUBLIC
  14. #define PRIVATE static
  15.  
  16. /*--------------------------------------------------------------------------*\
  17.    82050-compatible UART
  18. \*--------------------------------------------------------------------------*/
  19.  
  20. PRIVATE unsigned int uart      = 0x3F8;      /* base address of UART */
  21. PRIVATE unsigned int baud_rate =  1200;
  22.  
  23. #define UART_DATA       (uart)
  24. #define UART_IER        (uart+1)    /* Interrupt Enable Reg.         */
  25. #define UART_IIR        (uart+2)    /* Interrupt Identification Reg. */
  26. #define UART_LCR        (uart+3)    /* Line Control Reg.             */
  27. #define UART_MCR        (uart+4)    /* Modem Control Reg.            */
  28. #define UART_LSR        (uart+5)    /* Line Status Reg.              */
  29. #define UART_MSR        (uart+6)    /* Modem Status Reg.             */
  30. #define UART_SCR        (uart+7)    /* Scratchpad Reg.               */
  31. #define UART_BAL        UART_DATA
  32. #define UART_BAH        UART_IER
  33.  
  34. #define UART_CLOCK      (115200uL)
  35.  
  36. /*==========================================================================*\
  37.  
  38.    init_stdio()
  39.  
  40.       Must be called before any other function in this module!
  41.  
  42. \*--------------------------------------------------------------------------*/
  43.  
  44. PUBLIC void init_stdio(void)
  45. {
  46.    unsigned int baud_divisor;
  47.  
  48.    /* Compute divisor from baud rate and clock. */
  49.  
  50.    baud_divisor = (unsigned) (UART_CLOCK / (unsigned long)baud_rate);
  51.  
  52.    /* initialize UART */
  53.  
  54.    outp(UART_LCR, 0x83);   /* get ready to set baud rate... */
  55.    outp(UART_BAL, baud_divisor & 0x00FFu);
  56.    outp(UART_BAH, baud_divisor >> 8);
  57.    outp(UART_LCR, 0x03);   /* 8 data bits, 1 stop bit, no parity */
  58.    outp(UART_IER, 0x00);   /* no interrupts for any reason */
  59.    outp(UART_MCR, 0x03);   /* raise RTS & DTR */
  60.    inp(UART_LSR);          /* clear any pending receiver errors */
  61.  
  62. }
  63.  
  64.  
  65. /*==========================================================================*\
  66.  
  67.    putchar()
  68.  
  69. \*--------------------------------------------------------------------------*/
  70.  
  71. PUBLIC void putchar(int ch)
  72. {
  73.    if (ch == '\n') {       /* if sending a newline (LF), send a CR first */
  74.       putchar('\r');
  75.    }
  76.  
  77.    while ((inp(UART_LSR) & 0x20) == 0) {
  78.       /* Wait for tranmission holding register to be empty */
  79.    }
  80.  
  81.    outp(UART_DATA, ch);    /* transmit one character */
  82. }
  83.  
  84.  
  85. /*==========================================================================*\
  86.  
  87.    puts()
  88.  
  89. \*--------------------------------------------------------------------------*/
  90.  
  91. PUBLIC void puts(char *s)
  92. {
  93.    while (*s) {
  94.       putchar(*s);
  95.       s++;
  96.    }
  97.    putchar('\n');
  98. }
  99.  
  100. /*==========================================================================*\
  101.    End of source file.
  102. \*==========================================================================*/
  103.  
  104.  
  105.